地震学Shell常用命令教程

Author:Hongyu Xiao

Graduate Student
University of Illinois at Urbana–Champaign
August, 2020



如果有遇到问题的话

请联系我!

邮箱是:hongyu.xiao@hotmail.com

标题开头为: PEK_Summer_Question

例如 PEK_Summer_Question anaconda无法下载


Shell 部分学习预期

* 学会如何变更工作目录和查看当前工作目录

* 学会如何创建一个文件夹

* 学会如何对一个文件进行复制/移动/删除

* 学会查看文本行内容

* 学会使用管道(Pipeline ) 和 重定向 (Redirecting)

* (Optional) 其他shell操作


I. 目录操作

  1. ls
  2. pwd
  3. cd

    查看官方文档

    • man
    • --help

II. 文件操作

  1. mkdir
  2. cp
  3. mv
  4. rm

III. 简单文本行操作

  1. cat
  2. tail
  3. head

IV. 其他常用操作

  1. clear
  2. tar
  3. history

V. 管道(Pipeline ) 和 重定向 (Redirecting)

  1. "|"

  2. ">"

  3. ">>"


首先,什么是Shell ?

Shell 是命令操作系统执行操作的程序。 可以在计算机的控制台中输入命令,然后直接运行命令,也可以使用脚本运行批量命令。 PowerShell 和 Bash 等 Shell 为系统管理员提供了对其所负责的计算机进行优化控制所需的功能和精度。

Bash 此名称是 Bourne Again Shell 的缩写。Bash 成功的一个原因是其简易性。 与 Linux 的其他 shell 类似,Bash 也基于 Unix 设计理念。 正如 Peter Salus 在其著作“A Quarter Century of Unix”中总结的那样,Unix 中体现的三个“重要思想”是:

程序可以执行一项操作,并且可以完成得很好。 程序可以协同工作。 程序可以使用文本流作为通用接口。

最后一部分是了解 Bash 工作方式的关键。 在 Unix 和 Linux 中,所有内容都是文件

来源:https://docs.microsoft.com/en-us/learn/modules/bash-introduction


Bash/Shell 命令的基本格式

command [options] [arguments]

命令 [选项] [操作对象]

注: 命令是必须的,但是[选项]和[操作对象]不是必须的

I. 目录操作

此处的目录操作是指在命令行界面(CLI)进入或者切换不同的目录的操作。

主要涉及的命令(command)有三个

ls 显示当前工作目录下内容 pwd 显示当前工作目录地址 cd 切换到其他目录


1 查看当前工作目录下内容

ls

显示当前所在的目录下(又叫做当前工作目录)所包含的内容

In [24]:
%%bash

#ls ##显示当前目录下文件及文件夹

ls
Intro.ipynb
Intro_1.ipynb
Shell_Tutorial.ipynb

ls是常用命令之一,配合通配符,管道和重定向是我们在服务器内常用命令之一

下面给出一些例子

In [21]:
%%bash

echo "********************"

ls -al ##当前目录下,显示全部文件及权限

echo "*******************"

ls *Tutorial* -sh ##当前目录下,显示文件名含有Tutorial的文件,并显示其大小

echo "*******************"

ls [S,P,K,U]* ##当前目录下,显示文件名以S或者P或者K或者U开头的文件

echo "*******************"

ls ?hell_Tutorial.ipynb ##当前目录下,显示文件名为第一个字母未知,但是以hell_Tutorial.ipynb的文件
********************
total 56
drwxrwxrwx 1 hongyuxiao hongyuxiao  4096 Jul 22 16:37 .
drwxrwxrwx 1 hongyuxiao hongyuxiao  4096 Jul 21 16:58 ..
drwxrwxrwx 1 hongyuxiao hongyuxiao  4096 Jul 21 16:58 .ipynb_checkpoints
-rwxrwxrwx 1 hongyuxiao hongyuxiao  3845 Jul 22 16:21 Intro.ipynb
-rwxrwxrwx 1 hongyuxiao hongyuxiao  9071 Jul 22 16:21 Intro_1.ipynb
-rwxrwxrwx 1 hongyuxiao hongyuxiao 39259 Jul 22 16:37 Shell_Tutorial.ipynb
*******************
40K Shell_Tutorial.ipynb
*******************
Shell_Tutorial.ipynb
*******************
Shell_Tutorial.ipynb

如果我忘了这些-a -l -s -d选项怎么办?

在Shell下的大多数命令都配置了帮助文档,有两种方式可以进行查看

  1. Man 命令
  2. --help 选项

当然,你也可以上网进行搜索查看,网上有很多的的优质资源。


以下为两种方法作为例子进行帮助文档的查看,这个基本适用于任何Shell命令

In [21]:
%%bash

man ls
LS(1)                                               User Commands                                               LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information  about the FILEs (the current directory by default).  Sort entries alphabetically if none of
       -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              with -l, print the author of each file

       -b, --escape
              print C-style escapes for nongraphic characters

       --block-size=SIZE
              with -l, scale sizes by SIZE when printing them; e.g., '--block-size=M'; see SIZE format below

       -B, --ignore-backups
              do not list implied entries ending with ~

       -c     with -lt: sort by, and show, ctime (time of last modification of file  status  information);  with  -l:
              show ctime and sort by name; otherwise: sort by ctime, newest first

       -C     list entries by columns

       --color[=WHEN]
              colorize the output; WHEN can be 'always' (default if omitted), 'auto', or 'never'; more info below

       -d, --directory
              list directories themselves, not their contents

       -D, --dired
              generate output designed for Emacs' dired mode

       -f     do not sort, enable -aU, disable -ls --color

       -F, --classify
              append indicator (one of */=>@|) to entries

       --file-type
              likewise, except do not append '*'

       --format=WORD
              across -x, commas -m, horizontal -x, long -l, single-column -1, verbose -l, vertical -C

       --full-time
              like -l --time-style=full-iso

       -g     like -l, but do not list owner

       --group-directories-first
              group directories before files;

              can be augmented with a --sort option, but any use of --sort=none (-U) disables grouping

       -G, --no-group
              in a long listing, don't print group names

       -h, --human-readable
              with -l and -s, print sizes like 1K 234M 2G etc.

       --si   likewise, but use powers of 1000 not 1024

       -H, --dereference-command-line
              follow symbolic links listed on the command line

       --dereference-command-line-symlink-to-dir
              follow each command line symbolic link

              that points to a directory

       --hide=PATTERN
              do not list implied entries matching shell PATTERN (overridden by -a or -A)

       --hyperlink[=WHEN]
              hyperlink file names; WHEN can be 'always' (default if omitted), 'auto', or 'never'

       --indicator-style=WORD
              append  indicator  with style WORD to entry names: none (default), slash (-p), file-type (--file-type),
              classify (-F)

       -i, --inode
              print the index number of each file

       -I, --ignore=PATTERN
              do not list implied entries matching shell PATTERN

       -k, --kibibytes
              default to 1024-byte blocks for disk usage; used only with -s and per directory totals

       -l     use a long listing format

       -L, --dereference
              when showing file information for a symbolic link, show information for the file  the  link  references
              rather than for the link itself

       -m     fill width with a comma separated list of entries

       -n, --numeric-uid-gid
              like -l, but list numeric user and group IDs

       -N, --literal
              print entry names without quoting

       -o     like -l, but do not list group information

       -p, --indicator-style=slash
              append / indicator to directories

       -q, --hide-control-chars
              print ? instead of nongraphic characters

       --show-control-chars
              show nongraphic characters as-is (the default, unless program is 'ls' and output is a terminal)

       -Q, --quote-name
              enclose entry names in double quotes

       --quoting-style=WORD
              use  quoting  style WORD for entry names: literal, locale, shell, shell-always, shell-escape, shell-es鈥�
              cape-always, c, escape (overrides QUOTING_STYLE environment variable)

       -r, --reverse
              reverse order while sorting

       -R, --recursive
              list subdirectories recursively

       -s, --size
              print the allocated size of each file, in blocks

       -S     sort by file size, largest first

       --sort=WORD
              sort by WORD instead of name: none (-U), size (-S), time (-t), version (-v), extension (-X)

       --time=WORD
              with -l, show time as WORD instead of default modification time: atime or access or use (-u); ctime  or
              status (-c); also use specified time as sort key if --sort=time (newest first)

       --time-style=TIME_STYLE
              time/date format with -l; see TIME_STYLE below

       -t     sort by modification time, newest first

       -T, --tabsize=COLS
              assume tab stops at each COLS instead of 8

       -u     with  -lt:  sort by, and show, access time; with -l: show access time and sort by name; otherwise: sort
              by access time, newest first

       -U     do not sort; list entries in directory order

       -v     natural sort of (version) numbers within text

       -w, --width=COLS
              set output width to COLS.  0 means no limit

       -x     list entries by lines instead of by columns

       -X     sort alphabetically by entry extension

       -Z, --context
              print any security context of each file

       -1     list one file per line.  Avoid '\n' with -q or -b

       --help display this help and exit

       --version
              output version information and exit

       The SIZE argument is an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y  (pow鈥�
       ers of 1024) or KB,MB,... (powers of 1000).

       The  TIME_STYLE  argument  can  be full-iso, long-iso, iso, locale, or +FORMAT.  FORMAT is interpreted like in
       date(1).  If FORMAT is FORMAT1<newline>FORMAT2, then FORMAT1 applies to non-recent files and FORMAT2 to recent
       files.  TIME_STYLE prefixed with 'posix-' takes effect only outside the POSIX locale.  Also the TIME_STYLE en鈥�
       vironment variable sets the default style to use.

       Using color to distinguish file types is disabled both by default and with --color=never.  With  --color=auto,
       ls emits color codes only when standard output is connected to a terminal.  The LS_COLORS environment variable
       can change the settings.  Use the dircolors command to set it.

   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

AUTHOR
       Written by Richard M. Stallman and David MacKenzie.

REPORTING BUGS
       GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
       Report ls translation bugs to <https://translationproject.org/team/>

COPYRIGHT
       Copyright  漏  2018  Free  Software  Foundation,  Inc.   License  GPLv3+:  GNU   GPL   version   3   or   later
       <https://gnu.org/licenses/gpl.html>.
       This  is  free software: you are free to change and redistribute it.  There is NO WARRANTY, to the extent per鈥�
       mitted by law.

SEE ALSO
       Full documentation at: <https://www.gnu.org/software/coreutils/ls>
       or available locally via: info '(coreutils) ls invocation'

GNU coreutils 8.30                                  September 2019                                              LS(1)
In [22]:
%%bash

ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print C-style escapes for nongraphic characters
      --block-size=SIZE      with -l, scale sizes by SIZE when printing them;
                               e.g., '--block-size=M'; see SIZE format below
  -B, --ignore-backups       do not list implied entries ending with ~
  -c                         with -lt: sort by, and show, ctime (time of last
                               modification of file status information);
                               with -l: show ctime and sort by name;
                               otherwise: sort by ctime, newest first
  -C                         list entries by columns
      --color[=WHEN]         colorize the output; WHEN can be 'always' (default
                               if omitted), 'auto', or 'never'; more info below
  -d, --directory            list directories themselves, not their contents
  -D, --dired                generate output designed for Emacs' dired mode
  -f                         do not sort, enable -aU, disable -ls --color
  -F, --classify             append indicator (one of */=>@|) to entries
      --file-type            likewise, except do not append '*'
      --format=WORD          across -x, commas -m, horizontal -x, long -l,
                               single-column -1, verbose -l, vertical -C
      --full-time            like -l --time-style=full-iso
  -g                         like -l, but do not list owner
      --group-directories-first
                             group directories before files;
                               can be augmented with a --sort option, but any
                               use of --sort=none (-U) disables grouping
  -G, --no-group             in a long listing, don't print group names
  -h, --human-readable       with -l and -s, print sizes like 1K 234M 2G etc.
      --si                   likewise, but use powers of 1000 not 1024
  -H, --dereference-command-line
                             follow symbolic links listed on the command line
      --dereference-command-line-symlink-to-dir
                             follow each command line symbolic link
                               that points to a directory
      --hide=PATTERN         do not list implied entries matching shell PATTERN
                               (overridden by -a or -A)
      --hyperlink[=WHEN]     hyperlink file names; WHEN can be 'always'
                               (default if omitted), 'auto', or 'never'
      --indicator-style=WORD  append indicator with style WORD to entry names:
                               none (default), slash (-p),
                               file-type (--file-type), classify (-F)
  -i, --inode                print the index number of each file
  -I, --ignore=PATTERN       do not list implied entries matching shell PATTERN
  -k, --kibibytes            default to 1024-byte blocks for disk usage;
                               used only with -s and per directory totals
  -l                         use a long listing format
  -L, --dereference          when showing file information for a symbolic
                               link, show information for the file the link
                               references rather than for the link itself
  -m                         fill width with a comma separated list of entries
  -n, --numeric-uid-gid      like -l, but list numeric user and group IDs
  -N, --literal              print entry names without quoting
  -o                         like -l, but do not list group information
  -p, --indicator-style=slash
                             append / indicator to directories
  -q, --hide-control-chars   print ? instead of nongraphic characters
      --show-control-chars   show nongraphic characters as-is (the default,
                               unless program is 'ls' and output is a terminal)
  -Q, --quote-name           enclose entry names in double quotes
      --quoting-style=WORD   use quoting style WORD for entry names:
                               literal, locale, shell, shell-always,
                               shell-escape, shell-escape-always, c, escape
                               (overrides QUOTING_STYLE environment variable)
  -r, --reverse              reverse order while sorting
  -R, --recursive            list subdirectories recursively
  -s, --size                 print the allocated size of each file, in blocks
  -S                         sort by file size, largest first
      --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
                               time (-t), version (-v), extension (-X)
      --time=WORD            with -l, show time as WORD instead of default
                               modification time: atime or access or use (-u);
                               ctime or status (-c); also use specified time
                               as sort key if --sort=time (newest first)
      --time-style=TIME_STYLE  time/date format with -l; see TIME_STYLE below
  -t                         sort by modification time, newest first
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
  -u                         with -lt: sort by, and show, access time;
                               with -l: show access time and sort by name;
                               otherwise: sort by access time, newest first
  -U                         do not sort; list entries in directory order
  -v                         natural sort of (version) numbers within text
  -w, --width=COLS           set output width to COLS.  0 means no limit
  -x                         list entries by lines instead of by columns
  -X                         sort alphabetically by entry extension
  -Z, --context              print any security context of each file
  -1                         list one file per line.  Avoid '\n' with -q or -b
      --help     display this help and exit
      --version  output version information and exit

The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).

The TIME_STYLE argument can be full-iso, long-iso, iso, locale, or +FORMAT.
FORMAT is interpreted like in date(1).  If FORMAT is FORMAT1<newline>FORMAT2,
then FORMAT1 applies to non-recent files and FORMAT2 to recent files.
TIME_STYLE prefixed with 'posix-' takes effect only outside the POSIX locale.
Also the TIME_STYLE environment variable sets the default style to use.

Using color to distinguish file types is disabled both by default and
with --color=never.  With --color=auto, ls emits color codes only when
standard output is connected to a terminal.  The LS_COLORS environment
variable can change the settings.  Use the dircolors command to set it.

Exit status:
 0  if OK,
 1  if minor problems (e.g., cannot access subdirectory),
 2  if serious trouble (e.g., cannot access command-line argument).

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report ls translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/ls>
or available locally via: info '(coreutils) ls invocation'

2 显示当前工作目录地址

pwd

显示当前所在的工作目录的位置/绝对地址

In [8]:
%%bash

pwd ##显示当前所在的工作目录的位置
/mnt/c/Users/Jeff/OneDrive - University of Illinois - Urbana/Code/Seismology_Tutorials

Linux的绝对地址和相对地址

在Linux环境下,我们查看的地址分为绝对地址相对地址

  • 绝对地址

    文件或者程序所在的绝对路径,称为绝对地址。其主要的好处是绝对地址可以精确地定位文件或者目录,坏处是对于某些储存位置比较深的路径,绝对地址会比较长,使用起来会带来不便。

  • 相对地址

    文件或者程序所在的相对路径,成为相对地址,其相对的是 当前工作目录。 相对地址可以大幅度的降低地址长度,便于使用,但是缺陷在于由于其相对于当前工作目录,如果写入shell程序中,有时就会造成目录定位的混乱。

下面我们来举个例子:


In [22]:
%%bash 

pwd #当前工作目录
/mnt/c/Users/HongyuXiao/OneDrive - University of Illinois - Urbana/Code/Seismology_Tutorials

这个叫做当前工作目录

目前的显示方式是以绝对地址的形式现实的。

对于相对地址,主要有两个经常使用的命令:

. 代表的是当前工作目录

.. 代表的是当前工作目录的上一级

In [23]:
%%bash

cd .

echo 'I am the current working directory :'

pwd

echo '*********************************************************'

cd ..

echo 'I am the parent directory of the working directory:'

pwd

echo '*********************************************************'

find . -name Intro.ipynb

ls ./Seismology_Tutorials/Intro.ipynb -l
I am the current working directory :
/mnt/c/Users/HongyuXiao/OneDrive - University of Illinois - Urbana/Code/Seismology_Tutorials
*********************************************************
I am the parent directory of the working directory:
/mnt/c/Users/HongyuXiao/OneDrive - University of Illinois - Urbana/Code
*********************************************************
./Seismology_Tutorials/Intro.ipynb
-rwxrwxrwx 1 hongyuxiao hongyuxiao 3845 Jul 22 16:21 ./Seismology_Tutorials/Intro.ipynb

此处的find . -name Intro.ipynb结果就是按照相对地址进行显示的。

如果我们想要查看Intro.ipynb的详细信息

我们可以直接 ls ./Seismology_Tutorials/Intro.ipynb


3 切换当前工作目录

cd

从当前地址切换到其他工作目录,可以使用绝对地址/相对地址进行切换。

In [20]:
%%bash

echo "I am current working directory :"

pwd                  #显示当前工作目录

echo '********************************'

cd ..                #切换到当前工作目录的上级目录,使用相对地址

echo "Now I am at :"

pwd                  #显示当前工作目录

echo '********************************'

cd /mnt/c/Users      #切换到特定目录,使用绝对地址

echo "Now I am at :"

pwd                  #显示当前工作目录

echo '********************************'
I am current working directory :
/mnt/c/Users/HongyuXiao/OneDrive - University of Illinois - Urbana/Code/Seismology_Tutorials
********************************
Now I am at :
/mnt/c/Users/HongyuXiao/OneDrive - University of Illinois - Urbana/Code
********************************
Now I am at :
/mnt/c/Users
********************************

在Linux中,每次我们使用.或者..在路径的时候,请注意这都是相对于当前的工作路径而言的。

而如果我们是使用绝对的路径,我们则不需要担心这个问题.

但是如你所见,如果我们的路径名称非常长的时候,输入就变成了一件麻烦事,而且可能会带来意想不到的后果。

一般而言,我们使用时还是以方便为主,大多使用相对地址,少数情况下使用绝对地址


II. 文件操作

此处的文件操作是指在命令行界面(CLI)进行文件或者文件夹的创建,复制,修改,删除命令。

主要涉及的命令(command)有四个

mkdir 创建文件夹 cp 复制文件/文件夹 mv 移动文件/文件夹 rm 删除文件/文件夹

1 创建文件夹

mkdir

在当前工作目录下创建一个新的文件夹。

In [33]:
%%bash

mkdir Shell_Practice   #创建一个名为Shell_Practice的文件夹

ls */ -d               #显示在当前目录下所有的文件夹
Shell_Practice/

2 复制文件/文件夹

cp

对文件或者文件夹进行复制,操作对象可以是本地文件/文件夹,也可以是特定地址的文件/文件夹。

在运行程序的过程中,我们经常面对的情况是,我们需要对脚本中的某一个或者某几个的参数进行修改,

但是我们并不确定修改后的参数能否让程序运行,所以我们又不想破坏源文件,这时候我们有以下几个选择:

  • 使用Git对脚本进行版本控制
  • 在脚本中复制原命令行,粘贴后的内容,将原命令行注释掉
  • 使用cp原脚本进行拷贝以备份,让后修改源文件。

这三种方式都可以完成调试任务,由此可见,cp命令是我们非常常用的命令之一。

In [18]:
%%bash

ls   #查看当前目录下文件

echo '********************************'

cp Shell_Practice_Sample  Shell_Practice/Shell_Practice_Sample_Backup 

#复制Shell_Practice_Sample,重新命名为Shell_Practice_Sample_Backup

ls Shell_Practice

echo '********************************'
Intro.ipynb
Intro_1.ipynb
Shell_Practice
Shell_Practice_Sample
Shell_Tutorial.ipynb
********************************
Shell_Practice_Sample_Backup
********************************

在上面的例子里 第一个Shell_Practice_Sample就在操作的当前录下,所以我只需要输入文件名即可

而且我们的新文件被放入了Shell_Practice文件夹中,事实上,你可以从任何地址复制任何文件到另外任何一个地址中


除此之外, cp 命令还有个常用的功能是重命名功能。

在linux下,我们有多种重新命名文件的方式。下面以cp命令来进行重命名。

主要步骤是

  1. 复制原文件到原地址,讲其命名为新的文件名

  2. 删除原文件

In [19]:
%%bash

cd Shell_Practice

cp Shell_Practice_Sample_Backup Shell_Practice_Sample_NewName

rm Shell_Practice_Sample_Backup -rf

ls
Shell_Practice_Sample_NewName

3 移动文件/文件夹

mv

对文件或者文件夹进行复制,操作对象可以是本地文件/文件夹,也可以是特定地址的文件/文件夹。

In [31]:
%%bash

mkdir To_Be_Moved_Folder                 #创建一个文件夹叫做To_Be_Moved_Folder 

mv To_Be_Moved_Folder Shell_Practice     #将To_Be_Moved_Folder文件夹移动到Shell_Practice内

ls Shell_Practice -d                     #列出在Shell_Practice目录下所有的文件夹
Shell_Practice

除此之外,我们同样可以使用mv进行重命名。

In [32]:
%%bash

cd Shell_Practice                        #切换到Shell_Practice目录下

ls */ -d                                 #显示当前目录下的文件夹

echo '********************************'  #

mv To_Be_Moved_Folder New_Named_Folder   #将To_Be_Moved_Folder重命名为New_Named_Folder

ls */ -d                                 #显示当前目录下的文件夹

echo '********************************'
To_Be_Moved_Folder/
********************************
New_Named_Folder/
********************************

4 删除文件/文件夹 [慎用!]

-----------------慎用------------------

rm

对文件或者文件夹进行删除,操作对象可以是本地文件/文件夹,也可以是特定地址的文件/文件夹。

-----------------慎用------------------

例子:

rm 文件名

本次课程中,请小心使用rm命令!

In [35]:
%%bash

cp Shell_Practice_Sample Shell_Practice_Sample_RM 

ls Shell_Practice_Sample*

echo '********************************' 

rm Shell_Practice_Sample_RM

ls Shell_Practice_Sample*
Shell_Practice_Sample
Shell_Practice_Sample_RM
********************************
Shell_Practice_Sample

III. 简单文本行操作

此处的文件操作是指在命令行界面(CLI)进行简单的为文本行显示操作。

主要涉及的命令(command)有三个

cat 显示文本文件内容 tail 从文本末尾开始,显示文本内容 head 从文本开头开始,显示文本内容

1 显示文本文件内容

cat

显示文本文件的内容。

In [3]:
%%bash

cat Shell_Practice_Sample  #打印Shell_Practice_Sample文件
Hi Everyone, I am the first line of this code
And I am the second line!
Here is the third line of the code!
The fourth line at least is not the last one
I am the fifth, but we call it the best

平时的cat命令的使用是方便我们查看部分的文本文档。

因为cat命令相当于逐行打印文本内容,不涉及使用vim等软件的打开操作,不占用系统资源,而这个系统资源有时候是在服务器上操作必须要考虑的问题。


2 从文本末尾开始,显示文本内容

tail

从最后一行开始,显示文本内容。

tail命令是指从本文文件的末尾开始打印文本内容

对于我们而言,常用的方式是打印特定的倒数行。

例如:

In [39]:
%%bash

tail -n3 Shell_Practice_Sample  #打印Shell_Practice_Sample的倒数三行

echo
echo '********************************'

tail -c10 Shell_Practice_Sample  #打印Shell_Practice_Sample的倒数的10个字符
Here is the third line of the code!
The fourth line at least is not the last one
I am the fifth, but we call it the best
********************************
t the best

3 从文本开头开始,显示文本内容

head

从第一行开始,显示文本内容。

tail命令是指从本文文件的开头开始打印文本内容

对于我们而言,常用的方式是打印特定的开始行内容。

例如:

In [34]:
%%bash

head -n3 Shell_Practice_Sample  #打印Shell_Practice_Sample的开头三行

echo '********************************'

head -c10 Shell_Practice_Sample  #打印Shell_Practice_Sample的开头的10个字符
Hi Everyone, I am the first line of this code
And I am the second line!
Here is the third line of the code!
********************************
Hi Everyon

* cat head tail命令和其他命令的组合

对于cat/head/tail命令,我们常用的方式是利用pipeline (后面会提到) 和 其他的 命令进行结合,以便于进行快速的查找,定位等等

举个例子:

  • 注:我们在这里使用了管道和排序命令,在后面会有涉及
In [55]:
%%bash

ps -aux | sort -nk 2 | head -n 3                   # 查看此时服务上所有的进程,并且按照PID排列, 显示最小的2个PID进程

echo '********************************'

ps -aux | grep 'hongyu' | sort -nk 3 | head -n 3   # 查看所有hongyu名下的进程,并且按照CPU的占用进行排序,显示前三个

echo '********************************'

ls *.ipynb -s | sort -k 1 | tail -n 1              # 查看当前目录下全部的ipynb文件,按照其大小排序,显示最后(最大)的文件          

echo '********************************'

ls *.ipynb -t | sort | tail -n 1                  # 查看当前目录下全部的ipynb文件,按照其时间顺序排序,显示最新的文件
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8936   312 ?        Ssl  22:45   0:00 /init
root         6  0.0  0.0   8936   220 tty1     Ss   22:45   0:00 /init
********************************
hongyux+     7  0.0  0.0  18084  3600 tty1     S    22:45   0:00 -bash
hongyux+   759  0.0  0.0  16796  1888 tty2     S    23:19   0:00 /bin/bash --login
hongyux+   768  0.0  0.0  18880  2032 tty2     R    23:19   0:00 ps -aux
********************************
52 Shell_Tutorial.ipynb
********************************
Shell_Tutorial.ipynb

IV. 其他常用操作

此处的文件操作是指在命令行界面(CLI)常用的一些其他操作。

主要涉及的命令(command)有三个

clear 清除屏幕显示 tar 对文件或者文件夹进行压缩和解压缩 history 显示在shell中输入的命令历史

1 清除屏幕显示

clear

清除屏幕上已经显示的全部内容

In [56]:
%%bash

ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8936   312 ?        Ssl  22:45   0:00 /init
root         6  0.0  0.0   8936   220 tty1     Ss   22:45   0:00 /init
hongyux+     7  0.0  0.0  18084  3600 tty1     S    22:45   0:00 -bash
root       778  0.0  0.0   8936   220 tty2     Ss   23:23   0:00 /init
hongyux+   779  0.0  0.0  16796  1888 tty2     S    23:23   0:00 /bin/bash --login
hongyux+   785  0.0  0.0  18880  2036 tty2     R    23:23   0:00 ps -aux
In [58]:
%%bash

ps -aux | clear

以上为示意,具体的应用场景是在服务器端的时候,我们经过一些命令的查询和读取我们已经得到了相关的信息,这时候我们需要用clear命令来进行整个terminal页面的清空处理,以便于我们进行下一步的操作。


2 压缩或者解压缩处理

tar

对文件或者文件夹进行打包或者解压缩,其文件或文件夹可以是本地的,也可以是在某个地址之下的。

我们的程序包中生成的文件往往都是许多文件在一起的,在进行传输的时候会带来各种的不便

打包和解压缩也是比较日常的操作之一

tar命令就是我们用来打包和解压的命令

 -zcvf 选项代表创建压缩文件

 -zxvf 选项代表解压文件
In [65]:
%%bash

tar -zcvf Shell_Practice_Sample.tar Shell_Practice_Sample  

#创建一个Shell_Practice_Sample.tar的压缩文件,将Shell_Practice_Sample压缩进去

mkdir Another_Location

cd Another_Location

#创建一个新的文件夹Another_Location,并切换工作目录到这个文件夹

tar -zxvf ../Shell_Practice_Sample.tar 

#将Shell_Practice_Sample.tar 文件夹解压出来
Shell_Practice_Sample
Shell_Practice_Sample

我们创建了 一个压缩文件 Shell_Practice_Sample.tar 和 一个文件夹 Another_Location , 并且我们将压缩文件解压到了新建的文件夹内。

In [70]:
%%bash

ls 

echo '********************************'

ls Another_Location
Another_Location
Intro.ipynb
Intro_1.ipynb
Shell_Practice
Shell_Practice_Sample
Shell_Practice_Sample.tar
Shell_Tutorial.ipynb
********************************
Shell_Practice_Sample

3 显示Shell命令历史

history

查看之前输入的所有的shell命令,无论是否报错。


V. 管道(Pipeline) 和 重定向 (Redirecting)

"|" 管道命令,将管道前的命令的输出作为管道后命令的输入,可以在一行命令中多次使用

">" 重定向命令,将重定向之前的命令输入写入命令之后的文件,写入操作时为覆盖

">>" 重定向命令,将重定向之前的命令输入写入命令之后的文件,写入操作时为添加

1 管道命令

|

管道命令,将管道前的命令的输出作为管道后命令的输入,可以在一行命令中多次使用。

在服务器端,这是我们非常常用的命令。

以下给出几个例子:

In [89]:
%%bash

cat Shell_Practice_Sample | grep 'a' | wc -l 

#打印Shell_Practice_Sample,从中找出含有字母a的行,然后统计一共有多少行

echo '********************************'

cat Shell_Practice_Sample | awk '{ print "cp Shell_Practice_Sample "$1".ipynb"}' 

#打印Shell_Practice_Sample,以空格为间隔打印出每行的第一个单词,然后按照格式输出

echo '********************************'

ps -aux | sort -nk 2 | head -n 3                   

# 查看此时服务上所有的进程,并且按照PID排列, 显示最小的2个PID进程

echo '********************************'
4
********************************
cp Shell_Practice_Sample Hi.ipynb
cp Shell_Practice_Sample And.ipynb
cp Shell_Practice_Sample Here.ipynb
cp Shell_Practice_Sample The.ipynb
cp Shell_Practice_Sample I.ipynb
********************************
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8936   312 ?        Ssl  22:45   0:00 /init
root         6  0.0  0.0   8936   220 tty1     Ss   22:45   0:00 /init
********************************

通过管道命令,我们可以轻易地组合任何命令,并且这行可以是无限长的,也就是说我们可以使用无限次的管道命令。

这极大的提高了我们使用shell命令的效率,让我们可以很轻松的实现,查找,定位,排序,筛选,修改等操作


2.1 重定向 (Redirecting)

>

重定向命令,将重定向之前的命令输入写入命令之后的文件,写入操作时为覆盖。

2.2 重定向 (Redirecting)

>>

重定向命令,将重定向之前的命令输入写入命令之后的文件,写入操作时为添加。

In [93]:
%%bash

cat Shell_Practice_Sample | grep 'a' > Shell_Practice_Sample_With_a

#打印Shell_Practice_Sample,从中找出含有字母a的行,并覆盖写入Shell_Practice_Sample_With_a

cat Shell_Practice_Sample_With_a 

# 显示Shell_Practice_Sample_With_a 

echo '********************************'

echo 'Test_Sample' > Shell_Practice_Sample_Line2to3

#将‘Test_Sample’覆盖写入Shell_Practice_Sample_Line2to3

cat Shell_Practice_Sample | head -n 3 | tail -n 2 >> Shell_Practice_Sample_Line2to3

#打印Shell_Practice_Sample,从中找出第二行到第三行,添加写入Shell_Practice_Sample_Line2to3

cat Shell_Practice_Sample | tail -c 8 >> Shell_Practice_Sample_Line2to3

#打印Shell_Practice_Sample, 从中找出最后八个字符,添加写入Shell_Practice_Sample_Line2to3

cat Shell_Practice_Sample_Line2to3

# 显示Shell_Practice_Sample_Line2to3
Hi Everyone, I am the first line of this code
And I am the second line!
The fourth line at least is not the last one
I am the fifth, but we call it the best
********************************
Test_Sample
And I am the second line!
Here is the third line of the code!
the best

管道(Pipeline)和重定向(Redirecting)的区别

管道(Pipeline)和重定向(Redirecting)是我们在服务上非常频繁使用的命令之一,同时这两者有时候又会让人困惑,因为两者都是将符号之前的信息输入到符号之后,这里重点讲一下区别:

  1. 管道(Pipeline) | 指的是将前面命令的输出作为后面命令的输入,也就是说前面的命令是要有输出的,并且通常后面的命令也要要求输入。

  2. 重定向(Redirecting) >/>> 指的是将前面命令的输出写入/添加到某个文件,后面通常不涉及传递给后面命令输入。


* 我们为什么还要继续使用Shell?

  1. Linux原生,无需安装与配置

    在任何的linux服务器中都内置了shell命令,无需额外的配置和安装,并且在服务器端的大多数操作并不依赖图形界面,根据以上列出的命令,我们完全可以实现,而且是更高效的实现路径变换,文件查找,筛选,修改,删除等操作。所以学习Shell命令在地球物理学中还是必须且有意义的。

  1. 结合awk等文本处理器,高效且易于编写

    本次课程的程序部分都是基于python进行了改写,诚然,作为通用的脚本语言,python广受大家的喜爱,事实上对于地球物理学的应用来说,我们的shell环境下操作和文本处理,是完全可以更高效的编写和实现的。随着使用和学习的深入,将Shell,awk,sed等嵌合在一起的编写脚本会远比通用的python脚本要容易编写的多,并且由于编译和执行效率上存在损失,实际工作中结合shell的相关文本流处理显著的快不少。

小练习

  1. 在目录下创建一个文件夹,名字叫做 Shell_Homework
  1. 在Shell_Homework目录下创建一个文件,文件叫做Shell_Homework_Summary,将Shell_Homework_Summary的绝对路径存入Shell_Homework_Summary作为第一行
  1. 复制3份Shell_Homework_Summary在Shell_Homework下,取名为Backup_1/Backup_2/Backup_3
  1. 列出Shell_Homework中所有文件,并添加写入到Shell_Homework_Summary
  1. 将中所有文件进行打包,打包到一个叫做Shell_Homework.tar的文件中
  1. 创建一个新的文件夹Shell_Homework_Finished,将上一步的Shell_Homework.tar解压到Shell_Homework_Finished中
  1. 切换到Shell_Homework目录,显示Shell_Homework_Summary的第2行,添加到Shell_Homework_Summary文件中
  1. 删除Backup_2文件
  1. 将Backup_3文件重命名为Shell_Homework_Backup_3
  1. 列出Shell_Homework中所有文件,添加写入到Shell_Homework_Finished的Shell_Homework_Summary文件中

其他值得学习的命令

sort 排序命令

grep 查找关键词

ps 查看进程

du 查看磁盘占用

awk *文本行编辑

sed *文本流处理

echo 显示到标准输出

find 查找文件

wc 计数

chmod 修改权限

有问题? 请联系我!

Hongyu Xiao: hongyu.xiao@hotmail.com

In [ ]: